/**
 * @ClassDescription:
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2024/10/28 14:20
 */

import java.util.Objects;

/**
 * 浅拷贝和深拷贝
 *
 */
class Money implements Cloneable{
    public double m = 19.9;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}




class Person implements Cloneable{//如果这个类要实现克隆，必须要先实现Cloneable接口
    public String name;
    public int age;
    public Money money = new Money();//money作为一个实例变量,当变量创建的时候，变量里就已经包含这个money

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    /**
     * == 运算符比较的是两个对象的引用，只有在它们指向同一个对象时才会返回 true。
     * equals() 方法则比较的是两个字符串的内容，即使它们是不同的对象，只要内容相同，就会返回 true。
     *
     *
     */


//    @Override
//    public boolean equals(Object obj) {//重写方法必须返回类型，方法名和参数列表（参数类型和顺序）必须一样
//        Person tmp = (Person)obj;
//        return this.name.equals(tmp.name)
//                && this.age == tmp.age;
//    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person tmp = (Person)super.clone();//super调用父类的方法，this调用子类的方法
        tmp.money = (Money)this.money.clone();
        return tmp;
    }//调用这个方法，来调用object类的clone方法。即开创一个新的内存地址，内容即引用对象的内容

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
interface Ia{
    public static final int a = 10;//接口内变量必须初始化，默认为puflic static final修饰
    public abstract void draw();//接口内方法不能扩写，只能被实现，然后重写方法
    //默认被public abstract修饰
}
public class Test {
    public static void main(String[] args) {
        Person person = new Person("张三",19);
        Person person2 = new Person("张三",19);
        System.out.println(person.equals(person2));
    }
    public static void main1(String[] args) throws CloneNotSupportedException{
        Person person = new Person("张三",14);
      //  Money monwy1 = new Money();
        Person person1 = (Person)person.clone();//克隆方法的返回类型是Object类，子类变量指向父类对象是不安全的，所以要进行强转
        System.out.println(person.money.m);
        System.out.println(person1.money.m);
        System.out.println("----------------");
        person.money.m = 99.99;
        System.out.println(person.money.m);
        System.out.println(person1.money.m);
    }
}
